package com.hwd.gmall.product.util;

import org.csource.common.MyException;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件操作的工具类
 *
 * @author 黄伟东/Victor
 * @date 2022/4/19 17:53
 */
public class FastDfsUtil {

    /*
     * 在静态模块中加载配置文件的信息
     */
    static {

        try {
            // 1、加载配置文件
            ClassPathResource resource = new ClassPathResource("tracker.conf");

            // 2、fastDfs完成初始化
            ClientGlobal.init(resource.getPath());

        } catch (IOException | MyException e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件上传
     *
     * @param file 文件对象
     * @return java.lang.String 返回文件全量访问路径
     */
    public static String uploadFile(MultipartFile file) throws IOException, MyException {

        // 3、创建 tracker客户端，通过 tracker客户端 获取 trackerServer
        TrackerServer trackerServer = new TrackerClient().getConnection();

        // 4、通过 trackerServer 对象获取storage客户端
        StorageClient storageClient = new StorageClient(trackerServer, null);

        // 获取文件扩展名
        String fileExtName = StringUtils.getFilenameExtension(file.getOriginalFilename());

        // 5、通过storage客户端完成文件上传 uploadFile[0]=group name uploadFile[1]=filename
        /*
         * 参数1：文件字节码 byte[]
         * 参数2：文件扩展名 jpg txt png
         * 参数3：附加参数，如 时间、地点
         */
        String[] uploadFile = storageClient.upload_file(file.getBytes(), fileExtName, null);

        return uploadFile[0] + "/" + uploadFile[1];
    }

    /**
     * 文件删除
     *
     * @param groupName      组名
     * @param remoteFilename 文件路径
     * @return boolean
     */
    public static boolean deleteFile(String groupName, String remoteFilename) throws IOException, MyException {

        // 3、创建 tracker客户端，通过 tracker客户端 获取 trackerServer
        TrackerServer trackerServer = new TrackerClient().getConnection();

        // 4、通过 trackerServer 对象获取storage客户端
        StorageClient storageClient = new StorageClient(trackerServer, null);

        // 5、通过storage客户端完成文件删除
        int deleteFile = storageClient.delete_file(groupName, remoteFilename);

        return deleteFile == 0;
    }

    /**
     * 文件下载
     *
     * @param groupName      组名
     * @param remoteFilename 文件路径
     * @return byte[] 文件字节
     */
    public static byte[] downloadFile(String groupName, String remoteFilename) throws IOException, MyException {

        // 3、创建 tracker客户端，通过 tracker客户端 获取 trackerServer
        TrackerServer trackerServer = new TrackerClient().getConnection();

        // 4、通过 trackerServer 对象获取storage客户端
        StorageClient storageClient = new StorageClient(trackerServer, null);

        // 5、通过storage客户端完成文件删除
        return storageClient.download_file(groupName, remoteFilename);
    }

    /**
     * 作业: 下载图片,保存到自己电脑的d盘根目录
     *
     * @param groupName      在存储服务器中的的组名
     * @param remoteFilename 在存储服务器中的文件名
     */
    public static void downloadFile2Local(String groupName, String remoteFilename) throws IOException, MyException {

        FileOutputStream fos = null;

        try {
            byte[] bytes = downloadFile(groupName, remoteFilename);

            // 创建文件
            File file = getFile(groupName, remoteFilename);

            // 创建节点流
            fos = new FileOutputStream(file);
            fos.write(bytes);

        } finally {
            // 关流
            if (fos != null) {
                fos.close();
            }
        }
    }

    /**
     * 在本地F磁盘创建文件
     *
     * @param groupName      在存储服务器中的的组名
     * @param remoteFilename 在存储服务器中的文件名
     * @return java.io.File
     */
    private static File getFile(String groupName, String remoteFilename) throws IOException {

        // 获取文件名
        String fileName = "F:\\" + groupName + "\\" + remoteFilename.replace("/", "\\");

        // 获取文件路径
        String filePath = fileName.substring(0, fileName.lastIndexOf("\\"));

        // 创建文件夹
        File file1 = new File(filePath);
        if (!file1.exists()) {
            boolean mkdirs = file1.mkdirs();
            if (!mkdirs) {
                throw new RuntimeException("Could not create directory");
            }
        }

        // 创建文件
        File file = new File(fileName);
        if (!file.exists()) {
            boolean newFile = file.createNewFile();
            if (!newFile) {
                throw new RuntimeException("Could not create file");
            }
        }

        return file;
    }

    public static void main(String[] args) throws IOException, MyException {

        String groupName = "group1";
        String remoteFilename = "M00/00/00/wKjIgF5D2OuAAu3sAAH9QvQhwv8034.jpg";

        // 作业: 下载图片,保存到自己电脑的d盘根目录
        downloadFile2Local(groupName, remoteFilename);

        // 测试删除文件方法
//        boolean b = deleteFile(groupName, remoteFilename);
//        System.out.println("b = " + b);
    }

}
